package com.xbongbong.pro.sheet.pojo.vo;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.pojo.IdAndNamePojo;
import com.xbongbong.paas.pojo.IdNamePojo;
import com.xbongbong.paas.toolbox.wrap.BaseVO;
import com.xbongbong.saas.enums.business.PaySheetEnum;
import com.xbongbong.saas.enums.business.PaymentSheetEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 回、付款单明细vo
 * @author zcp
 * @version v1.0
 * @date 19/11/12 012 10:12
 * @update 19/11/12 012 10:12
 * @since v1.0
 */
@Getter
@Setter
@ToString
public class SheetAmountDetailGetVO extends BaseVO {
    private static final long serialVersionUID = -7703203795184185089L;

    /**
     * 查询出的信息list
     * JSONObject的key采用PaymentSheetEnum/PaySheetEnum内的字段attr，格式也封装成前端需要的格式
     * @see PaymentSheetEnum
     * @see PaySheetEnum
     */
    private List<JSONObject> list;

    /**
     * 总金额，需要限制明细内填充金额总和小于该值
     */
    private Double sumAmount;

    /**
     * 该方法用于回款单
     * 封装未回款信息，key用PaymentSheetEnum内的字段attr
     * 因保存时对格式有特定要求，因此该接口处理返回参数时，对一些特定字段进行了封装
     * @param contractId 合同id
     * @param contractSerialNo 合同编号
     * @param signUserId 签订人
     * @param signUserName 签订人名称
     * @param paymentInfo 回款信息，如果回款信息为null，则不塞入
     * @param amount 未收/已收金额
     * @param defaultAmount 默认填充的未收/已收金额（当从应收款关联新建时，只对关联新建的应收款填充未收/已收金额，其他的默认填充0）
     * @return com.alibaba.fastjson.JSONObject
     * @author zcp
     * @date 19/11/14 014 14:39
     * @update 19/11/14 014 14:39
     * @since v1.0
     * @version v1.0
     */
    public JSONObject formatInfo(Long contractId, String contractSerialNo, String signUserId, String signUserName, List<IdNamePojo> paymentInfo, Double amount, Double defaultAmount){
        List<IdNamePojo> contractInfo = Collections.singletonList(new IdNamePojo(contractId, contractSerialNo));
        List<IdAndNamePojo> signInfo = Collections.singletonList(new IdAndNamePojo(signUserId, signUserName));
        List<IdAndNamePojo> belongInfo = Collections.singletonList(new IdAndNamePojo(signUserId, signUserName));

        JSONObject jsonObject = new JSONObject();
        jsonObject.put(PaymentSheetEnum.CONTRACT.getAttr(), contractInfo);
        //合同导入时候无签订人处理
        if (signUserName == null) {
            signInfo = new ArrayList<>();
            belongInfo = new ArrayList<>();
        }
        jsonObject.put("contractSignPerson", signInfo);
        jsonObject.put(PaymentSheetEnum.BELONG_ID.getAttr(), belongInfo);
        //多增加一个amount，方便前端限制回款金额不能大于该值
        jsonObject.put("amount", amount);
        if (paymentInfo != null) {
            jsonObject.put(PaymentSheetEnum.PAYMENT.getAttr(), paymentInfo);
        }
        jsonObject.put(PaymentSheetEnum.AMOUNT.getAttr(), defaultAmount);
        return jsonObject;
    }

    /**
     * 该方法用于付款单
     * 封装未回款信息，key用PaySheetEnum内的字段attr
     * 因保存时对格式有特定要求，因此该接口处理返回参数时，对一些特定字段进行了封装
     * @param purchaseId 采购合同id
     * @param purchaseSerialNo 采购合同编号
     * @param signUserId 签订人
     * @param signUserName 签订人名称
     * @param payInfo 付款信息，如果付款信息为null，则不塞入
     * @param amount 未收/已收金额
     * @param defaultAmount 默认填充的未收/已收金额（当从付款计划关联新建时，只对关联新建的付款计划填充未收/已收金额，其他的默认填充0）
     * @return com.alibaba.fastjson.JSONObject
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public JSONObject formatInfo4Pay(Long purchaseId, String purchaseSerialNo, String signUserId, String signUserName, List<IdNamePojo> payInfo, Double amount, Double defaultAmount){
        List<IdNamePojo> contractInfo = Collections.singletonList(new IdNamePojo(purchaseId, purchaseSerialNo));
        List<IdAndNamePojo> signInfo = Collections.singletonList(new IdAndNamePojo(signUserId, signUserName));
        List<IdAndNamePojo> belongInfo = Collections.singletonList(new IdAndNamePojo(signUserId, signUserName));

        JSONObject jsonObject = new JSONObject();
        jsonObject.put(PaySheetEnum.LINK_PURCHASE.getAttr(), contractInfo);
        //采购合同导入时候无签订人处理
        if (signUserName == null) {
            signInfo = new ArrayList<>();
            belongInfo = new ArrayList<>();
        }
        jsonObject.put("contractSignPerson", signInfo);
        jsonObject.put(PaySheetEnum.BELONG_ID.getAttr(), belongInfo);
        //多增加一个amount，方便前端限制付款金额不能大于该值
        jsonObject.put("amount", amount);
        if (payInfo != null) {
            jsonObject.put(PaySheetEnum.PAY_PLAN.getAttr(), payInfo);
        }
        jsonObject.put(PaySheetEnum.AMOUNT.getAttr(), defaultAmount);
        return jsonObject;
    }
}
